package ru.mirent;

import io.qameta.allure.Allure;
import io.qameta.allure.attachment.DefaultAttachmentProcessor;
import io.qameta.allure.attachment.FreemarkerAttachmentRenderer;
import io.qameta.allure.model.Status;
import io.qameta.allure.model.StepResult;
import org.junit.jupiter.api.Test;

import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.util.UUID;
import java.util.function.Consumer;

/**
 * Различные примеры, связанные с Allure-отчетами.
 */
public class AllureExamplesTest {

    /**
     * Пример зафэйленного шага со статусом: FAILED. При этом сам тест остается со статусом 'PASSED'.
     */
    @Test
    void failedStepExampleTest() {
        Allure.getLifecycle().startStep(UUID.randomUUID().toString(),
                new StepResult().setName("Шаг, которому будет принудительно присвоен статус: FAILED"));
        Allure.getLifecycle().updateStep(new Consumer<StepResult>() {
            @Override
            public void accept(StepResult stepResult) {
                stepResult.setStatus(Status.FAILED);
            }
        });
        Allure.getLifecycle().stopStep();
    }

    /**
     * Пример зафэйленного шага со статусом: BROKEN. При этом сам тест остается со статусом 'PASSED'.
     */
    @Test
    void brokenStepExampleTest() {
        Allure.getLifecycle().startStep(UUID.randomUUID().toString(),
                new StepResult().setName("Шаг, которому будет принудительно присвоен статус: BROKEN"));
        Allure.getLifecycle().updateStep(new Consumer<StepResult>() {
            @Override
            public void accept(StepResult stepResult) {
                stepResult.setStatus(Status.BROKEN);
            }
        });
        Allure.getLifecycle().stopStep();
    }

    /**
     * Пример использования самописного Freemaker шаблона для вложения.
     */
    @Test
    void exampleCustomTemplateTest() {
        AttachmentToFreemakerTemplate attachmentToFreemakerTemplate =
                new AttachmentToFreemakerTemplate("Текст 1", "Текст 2", "Текст 3");
        (new DefaultAttachmentProcessor()).addAttachment(attachmentToFreemakerTemplate,
                new FreemarkerAttachmentRenderer("custom.ftl"));
    }

    /**
     * Пример формирования вложения из шаблона.
     */
    @Test
    void exampleCustomTemplate1Test() throws IOException {
        openFileAndGenerateAttachmentWithFreemakerTemplate("src/test/resources/jsons/example1.json",
                "custom_template_1.ftl");
    }

    /**
     * Пример формирования вложения из шаблона.
     */
    @Test
    void exampleCustomTemplate2Test() throws IOException {
        openFileAndGenerateAttachmentWithFreemakerTemplate("src/test/resources/jsons/example2.json",
                "custom_template_2.ftl");
    }

    private void openFileAndGenerateAttachmentWithFreemakerTemplate(String fileName, String templateName) throws IOException {
        File file = new File(fileName);
        byte[] encoded = Files.readAllBytes(file.toPath());
        String text = new String(encoded, Charset.defaultCharset());

        FreemakerJsonDataTemplate freemakerJsonDataTemplate =
                new FreemakerJsonDataTemplate(text);
        (new DefaultAttachmentProcessor()).addAttachment(freemakerJsonDataTemplate,
                new FreemarkerAttachmentRenderer(templateName));
    }
}
